package com.laboratory.miniooperate.util;

import org.springframework.http.MediaType;

import java.io.File;
import java.nio.file.Files;
import java.time.LocalDate;
import java.util.UUID;

public class MinioUtil {

    /**
     * 构建对象名称
     *
     * @param fileName
     * @return
     */
    public static String buildObjectName(String fileName) {
        String date = LocalDate.now().toString();
        String base = UUID.randomUUID().toString().replace("-", "");
        String ext = MinioUtil.safeExt(fileName);
        return date + "/" + base + ext;
    }

    /**
     * 获取文件后缀
     *
     * @param fileName
     * @return
     */
    public static String safeExt(String fileName) {
        if (fileName == null) {
            return "";
        }
        int index = fileName.lastIndexOf(".");
        if (index >= 0 && index < fileName.length() - 1) {
            return fileName.substring(index);
        }
        return "";
    }

    /**
     * application/octet-stream 是一种通用的二进制文件 MIME 类型：
     * 基本含义：表示任意的二进制数据流，是 HTTP 和其他协议中用于未知类型二进制文件的默认 MIME 类型
     * 使用场景：
     *  当服务器无法确定文件的具体类型时的默认返回值
     *  用于传输任意二进制数据
     *  文件下载时的通用类型
     * 特点：
     *  浏览器通常会将其视为需要下载的文件而不是直接显示
     *  不会被浏览器执行或渲染
     *  是一种安全的默认选择
     */

    /**
     * 获取文件类型
     *
     * @param contentType
     * @param fileName
     * @return
     */
    public static String pickContentType(String contentType, String fileName) {
        if (contentType != null && !contentType.isEmpty()) {
            return contentType;
        }
        try {
            if (fileName != null) {
                /**
                 * new File(fileName).toPath()：将文件名字符串转换为Path路径对象
                 * Files.probeContentType()：根据文件扩展名或文件内容探测MIME类型
                 * 如果探测成功返回相应的content-type，失败则返回null
                 */
                String probed = Files.probeContentType(new File(fileName).toPath());
                if (probed != null) {
                    return probed;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return MediaType.APPLICATION_OCTET_STREAM_VALUE;
    }

    /**
     * 获取文件名
     *
     * @param objectName
     * @return
     */
    public static String fileName(String objectName) {
        if (objectName == null) {
            return null;
        }
        int index = objectName.lastIndexOf("/");
        return index > 0 ? objectName.substring(index + 1) : objectName;
    }

}
